#include "../include/head.h"

// 顺序表的创建
S_arr_list *S_Arr_Init(void)
{
    S_arr_list *L = (S_arr_list *)malloc(sizeof(S_arr_list));
    if (L == NULL)
    {
        printf("顺序表创建失败\n");
        return NULL;
    }
    memset(L->data, 0, ARR_MAX_SIZ * sizeof(F_data));
    L->len = 0;
    return L;
}

// 顺序表的插入
int S_Arr_insert(S_arr_list *L, int pos, F_data data)
{
    if (L == NULL)
    {
        printf("顺序表 为 NULL\n");
        return -1;
    }
    if (L->len >= ARR_MAX_SIZ)
    {
        printf("顺序表已满\n");
        return -1;
    }
    if (pos < 1 || pos > L->len + 1)
    {
        printf("插入位置不合法\n");
        return -1;
    }

    // 从插入点开始后移数据
    for (int i = L->len; i >= pos; i--)
    {
        L->data[i] = L->data[i - 1];
    }

    L->data[pos - 1] = data;
    L->len++;
    return 0;
}

// 顺序表的删除
F_data S_Arr_delete(S_arr_list *L, int pos)
{
    F_data removed_data = {0};

    if (L == NULL)
    {
        printf("顺序表 为 NULL\n");
        return removed_data;
    }
    if (L->len == 0)
    {
        printf("顺序表内无数据\n");
        return removed_data;
    }
    if (pos < 1 || pos > L->len)
    {
        printf("删除位置不合法\n");
        return removed_data;
    }

    removed_data = L->data[pos - 1];
    // 将后续数据前移
    for (int i = pos; i < L->len; i++)
    {
        L->data[i - 1] = L->data[i];
        L->name[i - 1] = L->name[i];
    }
    L->len--;
    return removed_data;
}

// 顺序表的查找
F_data S_Arr_find_by_name(S_arr_list *L, char *name)
{

    F_data data;
    if (L == NULL)
    {
        printf("顺序表 为 NULL\n");
        return data;
    }
    if (L->len == 0)
    {
        printf("顺序表内无数据\n");
        return data;
    }
    for (int i = 0; i < L->len; i++)
    {
        if (strcmp(L->name[i].buf, name) == 0)
        {
            data = L->data[i];
            return data;
        }
    }
    return data;
}

// 顺序表的遍历
void S_Arr_printf(S_arr_list *L)
{
    if (L == NULL)
    {
        printf("顺序表 为 NULL\n");
        return;
    }
    if (L->len == 0)
    {
        printf("顺序表内无数据\n");
        return;
    }

    for (int i = 0; i < L->len; i++)
    {
        printf("用户名:%s\t班次:%d\t机型:%s\t起点站:%s\t终点站:%s\t起飞时间:%02d:%02d\t到达时间:%02d:%02d\t飞行时间:%s\t票价:%d\t载客量:%d\t剩余座位:%d\t是否飞:%c\n",
               L->name[i].buf, L->data[i].id, L->data[i].flighttype, L->data[i].startcity, L->data[i].arrivecity,
               L->data[i].starttime[0], L->data[i].starttime[1], L->data[i].arrivetime[0], L->data[i].arrivetime[1],
               L->data[i].flytime, L->data[i].value, L->data[i].maxNUM, L->data[i].leftbuyersa, L->data[i].whetherfly);
    }
}

// 顺序表的清空
void Clear_S_Arr_list(S_arr_list *L)
{
    memset(L->data, 0, ARR_MAX_SIZ * sizeof(L->data[0]));
    L->len = 0;
}

// 向文件写入用户航班信息顺序表
void S_Arr_File_print(S_arr_list *L, const char *file_name)
{
    // 安全判断
    if (L == NULL)
    {
        printf("顺序表 为 NULL\n");
        return;
    }
    if (L->len == 0)
    {
        printf("顺序表 内 无数据\n");
        return;
    }

    FILE *fp = fopen(file_name, "a");
    if (fp == NULL)
    {
        printf("文件创建失败\n");
        return;
    }
    fseek(fp, 0, SEEK_END); // 光标移动到末尾

    for (int i = 0; i < L->len; i++)
    {
        fprintf(fp, "用户名:%s\t班次:%d\t机型:%s\t起点站:%s\t终点站:%s\t起飞时间:%02d:%02d\t到达时间:%02d:%02d\t飞行时间:%s\t票价:%d\t载客量:%d\t剩余座位:%d\t是否飞:%c\n",
                L->name[i].buf, L->data[i].id, L->data[i].flighttype, L->data[i].startcity, L->data[i].arrivecity,
                L->data[i].starttime[0], L->data[i].starttime[1], L->data[i].arrivetime[0], L->data[i].arrivetime[1],
                L->data[i].flytime, L->data[i].value, L->data[i].maxNUM, L->data[i].leftbuyersa, L->data[i].whetherfly);
    }
    fflush(fp); // 刷新文件
    fclose(fp); // 关闭文件
}

// 向文件清空写入用户航班信息顺序表
void S_Arr_W_File_print(S_arr_list *L, const char *file_name)
{
    // 安全判断
    if (L == NULL)
    {
        printf("顺序表 为 NULL\n");
        return;
    }
    if (L->len == 0)
    {
        printf("顺序表 内 无数据\n");
        return;
    }

    FILE *fp = fopen(file_name, "w+");
    if (fp == NULL)
    {
        printf("文件创建失败\n");
        return;
    }
    fseek(fp, 0, SEEK_SET); // 光标移动到开头

    for (int i = 0; i < L->len; i++)
    {
        fprintf(fp, "用户名:%s\t班次:%d\t机型:%s\t起点站:%s\t终点站:%s\t起飞时间:%02d:%02d\t到达时间:%02d:%02d\t飞行时间:%s\t票价:%d\t载客量:%d\t剩余座位:%d\t是否飞:%c\n",
                L->name[i].buf, L->data[i].id, L->data[i].flighttype, L->data[i].startcity, L->data[i].arrivecity,
                L->data[i].starttime[0], L->data[i].starttime[1], L->data[i].arrivetime[0], L->data[i].arrivetime[1],
                L->data[i].flytime, L->data[i].value, L->data[i].maxNUM, L->data[i].leftbuyersa, L->data[i].whetherfly);
    }
    fflush(fp); // 刷新文件
    fclose(fp); // 关闭文件
}

// 从文件读取到用户航班信息顺序表
void S_Arr_File_scanf(S_arr_list *L, const char *file_name)
{
    if (NULL == L)
    {
        printf("用户航空信息表 为 NULL\n");
        return;
    }

    FILE *fp = fopen(file_name, "r"); // 打开文件
    if (fp == NULL)
    {
        printf("文件打开失败\n");
        return;
    }

    fseek(fp, 0, SEEK_SET); // 光标移动到开头
    Clear_S_Arr_list(L);    // 清空顺序表
    F_data data;            // 定义一个接收文件数据的结点
    char ch = 0;
    int pos = 0;

    // 检测文件行数
    while ((ch = fgetc(fp)) != EOF)
    {
        if (ch == '\n')
        {
            pos++;
        }
    }
    // 移动光标
    fseek(fp, 0, SEEK_SET);
    for (int i = 0; i < pos; i++)
    {
        fscanf(fp, "用户名:%s\t班次:%d\t机型:%s\t起点站:%s\t终点站:%s\t起飞时间:%02d:%02d\t到达时间:%02d:%02d\t飞行时间:%s\t票价:%d\t载客量:%d\t剩余座位:%d\t是否飞:%c\n",
               (L->name[i].buf), &data.id, data.flighttype, data.startcity, data.arrivecity,
               &data.starttime[0], &data.starttime[1], &data.arrivetime[0], &data.arrivetime[1],
               data.flytime, &data.value, &data.maxNUM, &data.leftbuyersa, &data.whetherfly);
        S_Arr_insert(L, 1, data);
    }
    fflush(fp); // 刷新文件
    fclose(fp); // 关闭文件
}